#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <vector>
#include <stdlib.h>

typedef void (*handler_t)();
// 函数指针类型
std::vector<handler_t> handlers; // 函数指针数组
void fun_one() {
printf("这是⼀个临时任务1\n");
}
void fun_two() {
printf("这是⼀个临时任务2\n");
}
void Load() {
handlers.push_back(fun_one);
handlers.push_back(fun_two);
}
void handler() {
if (handlers.empty())
Load();
for (auto iter : handlers)
iter();
}
int main() {
pid_t pid;
pid = fork();
if (pid < 0) {
printf("%s fork error\n", __FUNCTION__);
return 1;
} else if (pid == 0) { // child
printf("child is run, pid is : %d\n", getpid());
sleep(5);
exit(1);
} else {
int status = 0;
pid_t ret = 0;
do {
ret = waitpid(-1, &status, WNOHANG); // ⾮阻塞式等待
if (ret == 0) {
printf("child is running\n");
}
handler();
} while (ret == 0);
if (WIFEXITED(status) && ret == pid) {
printf("wait child 5s success, child return code is :%d.\n",
WEXITSTATUS(status));
} else {
printf("wait child failed, return.\n");
return 1;
}
}
return 0;
}









//int main(){
//    pid_t pid;
//    pid = fork();
//    if(pid < 0){
//        printf("%s fork error\n",__FUNCTION__);
//        return 1;
//    }else if(pid == 0){
//        printf("我是子进程，pid is:%d\n",getpid());
//        sleep(5);
//        exit(257);
//    } else{
//        int status = 0;
//        pid_t ret = waitpid(-1,&status,0);
//        printf("等待完毕");
//        if(WIFEXITED(status) && ret == pid){
//            printf("等待成功子进程的退出码为:%d.\n",WEXITSTATUS(status));
//        }else{
//            printf("等待失败\n");
//            return 1;
//        }
//    }
//    return 0;
//}
//
//
//
////int main()
////{
////printf("hello");
////_exit(0);
////}
//
//
//
//
//
//
//
//


//int main()
//{
//    printf("Hello world\n");
//    return 0;
//}
//
